let l = [("Don",435.);("Nut",75.);("Toto",42.)];;


let compare a b =
    match a with
        a when a = b -> 0
       |a when a > b -> 1
       |_ -> -1;;

let rec find nom liste =
    match liste with
        [] -> invalid_arg "la liste est vide"
       |(no,nb)::l -> let lnom = String.lowercase nom in 
                           match lnom with
                               lnom when lnom = String.lowercase no -> nb
                              |_ -> find (String.lowercase nom) l;;
 
find "Toto" l;;

let rec add (nom,nombre) liste =
    match liste with
        [] -> [(nom,nombre)]
       |(no,nb)::l -> match compare (String.lowercase nom) (String.lowercase no) with 
                           0 -> liste
                          |1 -> (no,nb)::(add (nom,nombre) l)
                          |_ -> (nom,nombre)::liste;;
  

add ("Tonio",4352.) l;;

let l = [("Don",435.);("Nut",75.);("Toto",42.)];;

add ("ToTO",4325645.)l;;



let rec delete nom liste =
    match liste with
        [] -> []
       |(no,nb)::l -> match compare nom no with
                           0 -> l
                          |1 -> (no,nb) :: delete nom l
                          |_ -> liste;;


delete "Tonio" l;;


let rec update nom nombre liste =
    match liste with
        [] -> []
       |(no,nb)::l ->  match compare nom no with
                            0 -> (no,nombre)::l
                           |1 -> (no,nb):: update nom nombre l
		  	   |_ -> liste;;

update "Toto" 42. l;;



let rec name nom newnom liste = 
    match liste with 
        [] -> []
       |(no,nb)::l -> match compare nom no with
                           0 -> add (newnom,nb) (delete nom l)
                          |1 -> (no,nb):: name nom newnom l
                          |_ -> liste;;

name "Toto" "Onutela" l;;   

name "Nut" "Acdc" l;; 


(* name ne met pas les noms par ordre alphabetique *)

(* mais exemple qui marche: add ("Onutela",42.) (delete "Toto" l);;

add ("Anutela",42.) (delete "Toto" l);; *)


let rec map f liste =
    match liste with
        [] -> []
       |e::l -> (f e):: (map f l);;



let rec sales liste reduc =
     match liste with
        [] -> []
       |(no,nb)::l -> (no, (nb -. nb *. reduc /. 100.)):: sales l reduc;;

sales l 10.;;


(* Recherches non concluantes pour Fusion: Ik&Ah: 

let rec fusion (nom,nombre) liste1 (nom2,nombre2) liste2 =
    match (liste1,liste2) with
        ([],[]) -> ([],[])
       |[],[(no2,nb2)::l2] -> (no2,nb2)::l2
       |[(no,nb)::l],[] -> (no,nb)::l
       |[(no,nb)::l],[(no2,nb2)::l2] -> match compare no no2 with
                                        0 -> (nom,nb+nb2)::(fusion (nom,nombre)l (nom2,nombre2)l2)
                                       |1 -> ((no,nb),(no2,nb2))::(fusion (nom,nombre)l (nom2,nombre2)l2)
				       |_ -> liste1 liste2;;



let rec fusion (nom,nombre) liste1 (nom2,nombre2) liste2 =
    match (liste1,liste2) with
        ([],[]) -> ([],[])
       |[],[(no2,nb2)::l2] -> liste2
       |[(no,nb)::l],[] -> listel
       |[(no,nb)::l],[(no2,nb2)::l2] -> match compare no no2 with
                                            0 -> (nom,nb+nb2)::(fusion (nom,nombre)l (nom2,nombre2)l2)
                                           |1 -> ((no,nb),(no2,nb2))::(fusion (nom,nombre)l (nom2,nombre2)l2)
				           |_ -> liste1 liste2;;          


let rec fusion (nom,nombre) liste (nom2,nombre2) liste2 =
    match liste with
        [] -> liste2
       |(no,nb)::l -> match liste2 with
                          [] -> liste
                         |(no2,nb2)::l2 -> match compare no no2 with
                                               0 -> (nom,nb+nb2)::(fusion (nom,nombre)l (nom2,nombre2)l2)
                                              |1 -> ((no,nb),(no2,nb2))::(fusion (nom,nombre)l (nom2,nombre2)l2)
				              |_ -> liste1 liste2;;          
let rec fusion (liste liste2) =
    match (liste,liste2) with
        ([],[]) -> ([],[])
       |((no,nb)::l,[]) -> liste
       |([],(no2,nb2)::l2) -> liste2
       |(no,nb)::l,(no2,nb2)::l2 -> let ltot = (no,nb)::l,(no2,nb2)::l2
                                        match compare no no2 with
                                            0 -> (no,nb + nb2)::(fusion l l2) 
                                           |1 -> (
					   |_ -> (no,nb)::(no2,nb2)::ltot;;

*) 



let l2 = [("Don",543.56);("Fillipo",674.23);("Tototo",12.12)];;

(* fusion (l,l2);; ne fonctionne pas car je n ai pas trouve let rec fusion *)
